/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 26727
 * Date: 2024-02-17
 * Time: 20:37
 */
public class Sort {

    //直接插入排序
    //时间复杂度：1+2+3+...+n  O(N^2)
    //最好情况：O(N)
    //当数据趋于有序的时候，排序速度非常快(一般场景就是数据基本有序,建议直接使用插入排序)
    //空间复杂度：O(1)
    //稳定性：稳定
    //如果一个排序可以是稳定的可以变成不稳定
    //如果一个排序不稳定不可以变成稳定
    public static void insertSort(int[] array) {
        for(int i = 1; i < array.length; i++) {
            int tmp = array[i];
            int j = i-1;
            for(; j >= 0; j--) {
                if(array[j] > tmp) {
                    array[j+1] = array[j];
                }else {
                    //array[j+1] = tmp;
                    break;
                }
            }
            array[j+1] = tmp;
        }
    }



    //希尔排序
    //时间复杂度：O(N^1.3) - O(N^1.5)
    //稳定性：不稳定
    public static void shellSort(int[] array) {
        int gap = array.length;
        while(gap > 1) {
            gap /= 2;
            shell(array,gap);
        }
    }

    public static void shell(int[] array,int gap) {
        for(int i = gap; i < array.length;i++) {
            int tmp = array[i];
            int j = i-gap;
            for(; j >= 0; j-=gap) {
                if(tmp < array[j]) {
                    array[j+gap] = array[j];
                }else {
                    break;
                }
            }
            array[j+gap] = tmp;
        }
    }
}
